使用捏合操纵器可以使用户在 Kanzi 应用程序中缩放和旋转节点。例如,您可以使用捏合操纵器让用户缩放图形。请参阅为节点启用捏合手势。
使用 捏合操纵器 (Pinch Manipulator) 触发器响应捏合手势。例如,您可以设置用户通过捏合手势缩放和旋转节点时的节点外观。请参阅使用捏合操纵器 (Pinch Manipulator) 触发器。
捏合操纵器是一种输入操纵器,您可以用于在 Kanzi 应用程序中添加手势识别到节点上。您可以通过 Kanzi Engine API 分配输入操纵器。请参阅使用输入操纵器。
通过完成教程学习如何使用捏合操纵器。请参阅教程:平移、缩放、轻敲。
要为节点启用捏合手势:
#
符号后跟别名名称访问别名目标节点。private: //为PinchManipulator::StartedMessage
消息定义处理程序,该消息来自 //具有可生成捏合消息的输入操纵器的 2D 节点。 //此处理程序可为捏合手势准备 2D 节点。 void onPinchStarted(PinchManipulator::StartedMessageArguments& messageArguments) { //从消息参数获得用户捏合的节点。 Node2DSharedPtr node2d = dynamic_pointer_cast<Node2D>(messageArguments.getSource()); if (!node2d) { return; } //当开始节点上的捏合手势,让节点位于前面。 node2d->moveToFront(); //存储渲染变换 (Render Transformation) 比例的初始值。 SRTValue2D nodeTransform = node2d->getRenderTransformation(); m_pinchInitialScaleFactor = nodeTransform.getScale().getX() - 1.0f; } //定义PinchManipulator::MovedMessage
消息的处理程序,该消息来自 //具有可生成捏合消息的输入操纵器的 2D 节点。 //这样可按捏合手势的量缩放和旋转 2D 节点。 void onPinchMoved(PinchManipulator::MovedMessageArguments& messageArguments) { //从消息参数获得用户捏合的节点。 Node2DSharedPtr node2d = dynamic_pointer_cast<Node2D>(messageArguments.getSource()); if (!node2d) { return; } float scale; //从消息参数获取比例和旋转。 float scaleDelta = messageArguments.getScale(); float rotateDelta = messageArguments.getRotation(); //获取节点的渲染变换 (Render Transformation) 属性。 SRTValue2D nodeTransform = node2d->getRenderTransformation(); //通过添加初始比例到捏合值计算比例。 scale = scaleDelta + m_pinchInitialScaleFactor; //应用旋转。 nodeTransform.rotate(rotateDelta); //应用比例。 nodeTransform.setScale(Vector2(scale, scale)); //要让节点围绕中心而非左上角旋转, //将渲染变换原点 (Render Transformation Origin) 属性设置为 (0.5, 0.5)。 node2d->setRenderTransformationOrigin(Vector2(0.5f, 0.5f)); //应用新变换到节点。 node2d->setRenderTransformation(nodeTransform); } //捏合手势的初始比例因子。 float m_pinchInitialScaleFactor;
MyProject() : m_pinchInitialScaleFactor(0.0f) { }
onProjectLoaded()
函数中创建 PinchManipulator
操纵器并订阅其消息。virtual void onProjectLoaded() KZ_OVERRIDE { ScreenSharedPtr screen = getScreen(); Domain* domain = getDomain(); //使用别名获取PinchNode 节点。 NodeSharedPtr pinchNode = screen->lookupNode<Node>("#PinchNode"); //创建生成捏合消息的输入操纵器。 PinchManipulatorSharedPtr pinchManipulator = PinchManipulator::create(domain); //添加输入操纵器到PinchNode。 pinchNode->addInputManipulator(pinchManipulator); //订阅PinchNode 的PinchManipulator::StartedMessage
消息。 //PinchManipulator
在用户在附加节点按下两根手指时生成此消息。 pinchNode->addMessageHandler(PinchManipulator::StartedMessage, bind(&MyProject::onPinchStarted, this, placeholders::_1)); //订阅 PinchNode 的PinchManipulator::MovedMessage
消息。 //PinchManipulator
在超出比例或旋转阈值时首次生成此消息, //然后在被跟踪触摸在更新之间移动时生成此消息。 pinchNode->addMessageHandler(PinchManipulator::MovedMessage, bind(&MyProject::onPinchMoved, this, placeholders::_1)); }
使用 捏合操纵器 (Pinch Manipulator) 触发器响应捏合手势。例如,您可以设置用户通过捏合手势缩放和旋转节点时的节点外观。
捏合操纵器 (Pinch Manipulator) 有这些触发器:
要使用捏合操纵器 (Pinch Manipulator) 触发器:
有关详细信息,请参阅 API reference中的 PinchManipulator
类。